home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / pcr / pcr4_4.lha / DIST / threads / ThreadsDynamicEnvironment.c < prev    next >
C/C++ Source or Header  |  1990-06-22  |  5KB  |  215 lines

  1. /* begincopyright
  2.   Copyright (c) 1988 Xerox Corporation. All rights reserved.
  3.   Use and copying of this software and preparation of derivative works based
  4.   upon this software are permitted. Any distribution of this software or
  5.   derivative works must comply with all applicable United States export
  6.   control laws. This software is made available AS IS, and Xerox Corporation
  7.   makes no warranty about the software, its performance or its conformity to
  8.   any specification. Any person obtaining a copy of this software is requested
  9.   to send their name and post office or electronic mail address to:
  10.     PCR Coordinator
  11.     Xerox PARC
  12.     3333 Coyote Hill Rd.
  13.     Palo Alto, CA 94304
  14.   endcopyright */
  15.  
  16.  
  17. /*
  18.  * ThreadsDynamicEnvironment.c
  19.  * Copyright ╙ 1990 by Xerox Corporation.  All rights reserved.
  20.  * Last changed by Pavel on May 24, 1990 6:20:34 pm PDT
  21.  *
  22.  * Edited by Demers, June 20, 1990 9:50:56 am PDT
  23.  */
  24.  
  25.  
  26. #include "xr/Threads.h"
  27.  
  28. #include "xr/ThreadsMsgPrivate.h"
  29.  
  30. #include "xr/ThreadsDynamicEnvironment.h"
  31.  
  32. XR_Pointer XR_UnwindFrameKey = (XR_Pointer) &XR_UnwindFrameKey;
  33.  
  34.  
  35. int
  36. XR_UnwindTo(target)
  37.     XR_DynFrame target;
  38. {
  39.     XR_Pointer myKey = XR_UnwindFrameKey;
  40.     XR_DynFrame de = XR_GetDynamicEnvironment();
  41.     XR_DynFrame f;
  42.   
  43.     for (f = de; (f != NIL) && (f != target); f = f->df_link)
  44.         ;
  45.     if (f == NIL)
  46.         return -1;
  47.   
  48.     for (f = de; f != target; f = f->df_link) {
  49.         if (f->df_key == myKey) {
  50.             XR_UnwindFrame uf = (XR_UnwindFrame) f;
  51.             XR_MesaProc unwinder = uf->uf_unwinder;
  52.       
  53.             if (unwinder != NIL) {
  54.                 XR_SetDynamicEnvironment(uf->uf_link);
  55.                 (*(unwinder->mp_proc))(unwinder);
  56.             }
  57.         }
  58.     }
  59.     XR_SetDynamicEnvironment(target);
  60.     return 0;
  61. }
  62.  
  63.  
  64. int
  65. XR_RewindTo(target)
  66. XR_DynFrame target;
  67. {
  68.   extern void DoRewind(/* end, f, key */);
  69.   XR_DynFrame de = XR_GetDynamicEnvironment();
  70.   XR_DynFrame f;
  71.   
  72.     for (f = target; (f != NIL) && (f != de); f = f->df_link)
  73.         ;
  74.     if (f == NIL)
  75.         return -1;
  76.   
  77.     DoRewind(de, target, XR_UnwindFrameKey);
  78.     XR_SetDynamicEnvironment(target);
  79.     return 0;
  80. }
  81.  
  82.  
  83. #define REWIND_BATCH    32
  84.  
  85. static void
  86. DoRewind(end, f, key) /* call all rewinders in (end..f] in that order */
  87.     XR_DynFrame end, f;
  88.     XR_Pointer key;
  89. {
  90.     XR_DynFrame stack[REWIND_BATCH];
  91.     int i = 0;
  92.  
  93.     for(;;) {
  94.         if( f == NIL ) XR_Panic("DoRewind 0");
  95.         if( f == end ) break;
  96.         if( f->df_key == key ) {
  97.             if( i == REWIND_BATCH ) {
  98.                 DoRewind(end, f);
  99.                 break;
  100.             } else {
  101.                 stack[i] = f;
  102.                 i++;
  103.             }
  104.         }
  105.         f = f->df_link;
  106.     }
  107.     while( i > 0 ) {
  108.         XR_UnwindFrame uf;
  109.         XR_MesaProc rewinder;
  110.         i -= 1;
  111.         uf = (XR_UnwindFrame)(stack[i]);
  112.         if( (rewinder = uf->uf_rewinder) != NIL ) {
  113.             XR_SetDynamicEnvironment(uf->uf_link);
  114.             (*(rewinder->mp_proc))(rewinder);
  115.         }
  116.     }
  117. }
  118.  
  119.  
  120.  
  121.  
  122. XR_DynFrame
  123. XR_LookupInDynamicEnvironment(key, de)
  124.     XR_Pointer key;
  125.     XR_DynFrame de;
  126. {
  127.     XR_DynFrame f;
  128.     void Damn();
  129.   
  130.     for (f = de; f != NIL; f = f->df_link) {
  131.         if (((unsigned) f) & 0x3)
  132.             Damn(de);
  133.         if (f->df_key == key)
  134.             return f;
  135.     };
  136.   
  137.     return NIL;
  138. }
  139.  
  140.  
  141. static void
  142. Damn(de)
  143.     XR_DynFrame de;
  144. {
  145.     XR_DynFrame f = de;
  146.   
  147.     XR_PrintF("\nXR_LookupInDynamicEnvironment given a bad DE:\n");
  148.     for (;;) {
  149.         XR_PrintF("\t0x%x\n", f);
  150.         if (f == NIL || ((unsigned) f) & 0x3 != 0)
  151.             break;
  152.         f = f->df_link;
  153.     };
  154.     XR_CallDebugger(de);
  155. }
  156.  
  157.  
  158. static unsigned
  159. EnvironmentLength(de)
  160.     XR_DynFrame de;
  161. {
  162.     unsigned len = 0;
  163.   
  164.     while (de != NIL) {
  165.         len++;
  166.         de = de->df_link;
  167.     };
  168.     return len;
  169. }
  170.  
  171.  
  172. XR_DynFrame
  173. XR_FirstCommonParent(de1, de2)
  174.     XR_DynFrame de1, de2;
  175. {
  176.     unsigned len1 = EnvironmentLength(de1);
  177.     unsigned len2 = EnvironmentLength(de2);
  178.  
  179.     while (len1 > len2) {
  180.         de1 = de1->df_link;
  181.         len1--;
  182.     };
  183.   
  184.     while (len2 > len1) {
  185.         de2 = de2->df_link;
  186.         len2--;
  187.     };
  188.    
  189.     /* de1 and de2 are now the same length */
  190.     while (de1 != de2) {
  191.         de1 = de1->df_link;
  192.         de2 = de2->df_link;
  193.     };
  194.   
  195.     return de1;
  196. }
  197.  
  198.  
  199. #undef XR_GetDynamicEnvironment
  200.  
  201. XR_DynFrame
  202. XR_GetDynamicEnvironment()
  203. {
  204.     return ((XR_DynFrame)(XR_currThread->t_dynEnv));
  205. }
  206.  
  207.  
  208. #undef XR_SetDynamicEnvironment
  209. void
  210. XR_SetDynamicEnvironment(f)
  211.     XR_DynFrame f;
  212. {
  213.     XR_currThread->t_dynEnv = (XR_Pointer) f;
  214. }
  215.